/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    video_manager.c
 * @brief   视频数据管理者文件，函数的实现
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-26   | v0.0.1    | Kcode   | 视频数据管理者文件
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#include <string.h>

#include "config.h"
#include "video_recv_manager.h"
#include "debug_manager.h"

static PT_VIDEORECV s_ptVideoRecvHead = NULL; /**< 支持设备链表头 */

/*!
 * @brief  注册函数
 * @param  ptVideoRecv[in] 要注册的设备结构体结点
 * @return 0：成功 -1：失败
 */
int RegisterVideoRecv(PT_VIDEORECV ptVideoRecv)
{
	PT_VIDEORECV ptTmp;

	if (!s_ptVideoRecvHead)
	{
		s_ptVideoRecvHead   = ptVideoRecv;
		ptVideoRecv->ptNext = NULL;
	}
	else
	{
		ptTmp = s_ptVideoRecvHead;
		while (ptTmp->ptNext)
		{
			ptTmp = ptTmp->ptNext;
		}
		ptTmp->ptNext     = ptVideoRecv;
		ptVideoRecv->ptNext = NULL;
	}

	return 0;
}

/*!
 * @brief  显示所支持的设备
 * @param  [in] 无
 * @return 无 
 */
void ShowVideoRecv(void)
{
	int i = 0;
	PT_VIDEORECV ptTmp = s_ptVideoRecvHead;

	while (ptTmp)
	{
		printf("%02d %s\n", i++, ptTmp->name);
		ptTmp = ptTmp->ptNext;
	}
}

/*!
 * @brief  根据name得到指定的设备文件
 * @param  pName[in] 名字
 * @return 成功：返回设备的结构体指针 失败：返回空指针
 */
PT_VIDEORECV GetVideoRecv(char *pName)
{
	PT_VIDEORECV ptTmp = s_ptVideoRecvHead;
	
	while (ptTmp)
	{
		if (strcmp(ptTmp->name, pName) == 0)
		{
			return ptTmp;
		}
		ptTmp = ptTmp->ptNext;
	}
	return NULL;
}

/*!
 * @brief  初始化函数，把对支持的各个设备注册进链表进行统一管理
 * @param  [in] 无
 * @return  无
 */
int VideoRecvInit(void)
{
	int error;
	
	error = video_recv_init();
	if (error)
	{
		DBG_PRINTF("Video_Recv_Init!\n");
		return -1;
	}

	return 0;
}

#if 0
/*!
 * @brief  退出函数，对设备进行具体的清理工作
 * @param  [in] 无
 * @return  无
 */
void VideoExit(char *name, PT_VIDEOBUF video_buf)
{
	PT_VIDEORECV ptTmp = s_ptVideoRecvHead;
	
	while (ptTmp)
	{
		if (strcmp(ptTmp->name, name) == 0)
            ptTmp->ExitDevice(video_buf);

        ptTmp = ptTmp->ptNext;
	}
}
#endif

